package com.sunxiansheng.trace;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * Description: traceId上下文
 */
public class TraceIdContext {

    /**
     * 子线程在创建的时候会将父线程的 InheritableThreadLocal 复制一份（但是父子线程的InheritableThreadLocal是独立的）
     */
    public static final InheritableThreadLocal<String> CURRENT_TRACE_ID = new InheritableThreadLocal<>();

    public static String generateTraceId() {
        return UUID.randomUUID().toString();
    }

    public static String getTraceId() {
        // 优先从 ThreadLocal 获取 traceId
        return CURRENT_TRACE_ID.get();
    }

    /**
     * 设置traceId到上下文中
     * @param traceId
     */
    public static void setTraceId(String traceId) {
        CURRENT_TRACE_ID.set(traceId); // 设置到 InheritableThreadLocal
        MDC.put(TraceIdConstant.TRACE_ID, traceId); // 设置到 MDC
    }

    /**
     * 清除traceId
     */
    public static void clearTraceId() {
        CURRENT_TRACE_ID.remove(); // 清除 InheritableThreadLocal
        MDC.remove(TraceIdConstant.TRACE_ID); // 清除 MDC
    }
}